// Symbol:一种原始数据类型
// 最主要的作用就是为对象添加独一无二的属性名

/******  common.js*************/
const cache = {}

/***********a.js****************/

// cache['foo'] = Math.random();

// /************b.js******************/

// cache['foo'] = 123

// //在现在开发中多用于第三方插件开发，会存在属性覆盖
// console.log(cache); //{ foo: 123 }

// 后针对此情况约定属性命名

cache['a_foo'] = Math.random();

/************b.js******************/

cache['b_foo'] = 123

//在现在开发中多用于第三方插件开发，会存在属性覆盖
console.log(cache); //{ foo: 123 }


// es6中采用symbol处理唯一值的情况，防止属性覆盖

const s = Symbol()
console.log(s);
console.log(typeof s);

console.log(Symbol() === Symbol()); //false

console.log(Symbol('foo'));
console.log(Symbol('bar'));
console.log(Symbol('baz'));


const obj = {}
obj[Symbol()] = '123'
obj[Symbol()] = '222'
console.log(obj); //{ [Symbol()]: '123', [Symbol()]: '222' }

const obj1 = {
    [Symbol()]: '123'
}
console.log(obj1); //{ [Symbol()]: '123' }

// 运用symbol实现私有资源
/****************c.js******************/
const name = Symbol()
const person = {
    [name]: '123',
    say() {
        console.log(this[name]);
    }
}

/****************d.js********************/
// 此方式调用私有的方法访问属性
person.say() //123

// 跨文件无法访问源对象属性
console.log(person.name); //undeined
console.log(person[name]); //123


// 以后可能有Bignt数据类型：用于存放更大数据内存的数据
// 即：8大数据类型
// Number/Boolean/String/Null/symbol/undefined/object/bigInt